package com.roads.project.mapper;

import java.math.BigDecimal;
import java.util.List;
import com.roads.project.domain.ProBoq;
import com.roads.project.domain.ProBoqMeterage;
import org.apache.ibatis.annotations.Param;

/**
 * 标段清单Mapper接口
 * 
 * @author nhp
 * @date 2021-11-30
 */
public interface ProBoqMapper {

    /**
     * 查询标段清单
     * 
     * @param id 标段清单主键
     * @return 标段清单
     */
    ProBoq selectProBoqById(Long id);

    /**
     * 根据清单编号和机构编号查询清单
     *
     * @param institutionCode 机构编号
     * @param boqCode 清单编号
     * @return
     */
    ProBoq selectProBoqByCode(@Param("institutionCode")String institutionCode,@Param("boqCode") String boqCode);

    /**
     * 根据工程量清单编号查询清单
     *
     * @param institutionBoqCode 标段清单编号
     * @return 标段工程量清单
     */
    ProBoq getModelByInstitutionBoqCode(@Param("institutionBoqCode")String institutionBoqCode);

    /**
     * 查询子节点数量
     *
     * @param institutionCode 标段编号
     * @param parentCode 清单父项编号
     * @return 数量
     */
    int countChildren(@Param("institutionCode")String institutionCode,@Param("parentCode") String parentCode);

    /**
     * 根据标段编号和清单编号查询子节点
     *
     * @param institutionCode 标段编号
     * @param boqCode 清单编号
     * @return 标段工程量清单集合
     */
    List<ProBoq> selectChildrenList(@Param("institutionCode")String institutionCode,@Param("boqCode") String boqCode);

    /**
     * 查询标段清单列表
     * 
     * @param proBoq 标段清单
     * @return 标段工程量清单集合
     */
    List<ProBoq> selectProBoqList(ProBoq proBoq);

    /**
     * 查询标段清单树形列表(名称=清单编号+清单名称)
     *
     * @param proBoq 标段清单
     * @return 标段工程量清单集合
     */
    List<ProBoq> selectProBoqTreeList(ProBoq proBoq);

    /**
     * 查询标段清单大类列表（名称=清单编号+清单名称）
     * @param proBoq 标段工程量清单
     * @return 标段工程量清单集合
     */
    List<ProBoq> selectBigTypeList(ProBoq proBoq);

    /**
     * 查询标段清单列表(名称=清单编号+清单名称)
     *
     * @param proBoq 标段工程量清单
     * @return 标段工程量清单集合
     */
    List<ProBoq> selectLeafNodeList(ProBoq proBoq);

    /**
     * 查询标段下所有叶子节点清单
     *
     * @param proBoq 标段工程量清单
     * @return 标段工程量清单集合
     */
    List<ProBoq> selectLeafNodeAllList(ProBoq proBoq);

    /**
     * 查询标段工程量清单
     * 根据祖籍列表里的大类查询
     * @param institutionCode 机构编码
     * @param ancestors 祖籍列表大类集合
     * @return 标段工程量清单集合
     */
    List<ProBoq> selectFindInSetList(@Param("institutionCode")String institutionCode, @Param("ancestors") String ancestors);

    /**
     * 查询计量清单合计值
     *
     * @param institutionCode 标段编号
     * @return 集合
     */
    List<ProBoq> sumListByInstitutionCode(@Param("institutionCode")String institutionCode);

    /**
     * 新增标段清单
     * 
     * @param proBoq 标段清单
     * @return 结果
     */
    int insertProBoq(ProBoq proBoq);

    /**
     * 批量增加标段清单
     *
     * @param list 数据集合
     * @return 结果
     */
    int insertBatch(List<ProBoq> list);

    /**
     * 修改标段清单
     * 
     * @param proBoq 标段清单
     * @return 结果
     */
    int updateProBoq(ProBoq proBoq);

    /**
     * 批量修改清单
     *
     * @param list 数据集合
     */
    void updateBatch(List<ProBoq> list);

    /**
     * 删除标段清单
     * 
     * @param id 标段清单主键
     * @return 结果
     */
    int deleteProBoqById(Long id);

    /**
     * 批量删除标段清单
     * 
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    int deleteProBoqByIds(Long[] ids);

    /**
     * 清空标段工程量清单
     *
     * @param institutionCode 标段编号
     */
    void clean(String institutionCode);

    /**
     * 根据项目ID/用户查询变更金额
     *
     * @param projectId 项目id
     * @param user 用户
     * @return 变更金额
     */
    BigDecimal getChangeTotalByProjectIdAndUser(@Param("projectId")Integer projectId, @Param("user") String user);

    /**
     * 根据项目ID查询变更金额
     *
     * @param projectId 项目id
     * @return 变更金额
     */
    BigDecimal getChangeTotalByProjectId(@Param("projectId") Integer projectId);

}
